﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using NangLuongTieuDiemDTO.DTO;

namespace NangLuongTieuDiemDAO.DAO
{
    public class HoaDonDAO
    {
        #region "[Insert]"
        /// <summary>
        /// Thêm 1 đối tượng HoaDon
        /// </summary>
        /// <param name="hdDto">đối tượng HoaDon cần thêm</param>
        /// <returns></returns>
        public static int Insert(HoaDonDTO hdDto)
        {
            int ID = -1;
            try
            {
                // Mo ket noi
                SqlConnection cn = NangLuongTieuDiemDAO.DataHelper.SqlDataHelper.ConnectionData();

                // Chuoi sql thao tac csdl
                string strSQL = "insert into HoaDon(TongGiaTien, Xoa, GhiChu, NgayLap) values(@TongGiaTien ,@Xoa ,@GhiChu ,@NgayLap)";

                // Thuc thi chuoi sql
                SqlCommand cmd = new SqlCommand(strSQL, cn);


                cmd.Parameters.Add("@TongGiaTien", SqlDbType.Decimal);
                cmd.Parameters.Add("@Xoa", SqlDbType.Bit);
                cmd.Parameters.Add("@GhiChu", SqlDbType.NText);
                cmd.Parameters.Add("@NgayLap", SqlDbType.DateTime);

                cmd.Parameters["@TongGiaTien"].Value = Convert.ToDecimal(hdDto.TongGiaTien);
                cmd.Parameters["@Xoa"].Value = hdDto.Xoa;
                cmd.Parameters["@GhiChu"].Value = hdDto.GhiChu;
                cmd.Parameters["@NgayLap"].Value = hdDto.NgayLap;

                cmd.ExecuteNonQuery();

                // lay ID cua dong insert

                strSQL = "Select @@IDENTITY";
                cmd = new SqlCommand(strSQL, cn);
                ID = Convert.ToInt32(cmd.ExecuteScalar());

                // dong ket noi csdl
                cn.Close();
            }
            catch(Exception ex)
            {
                InSert_LoiHeThong("Insert", ex);
            }
            return ID;
        }
        #endregion

        #region "[Update]"
        /// <summary>
        /// Cập nhật đối tượng HoaDon
        /// </summary>
        /// <param name="hdDto">đối tượng HoaDon cần cập nhật</param>
        /// <returns></returns>
        public static bool Update(HoaDonDTO hdDto)
        {
            bool isSuccess = false;
            SqlConnection cn;
            try
            {
                // Mo ket noi
                cn = NangLuongTieuDiemDAO.DataHelper.SqlDataHelper.ConnectionData();

                // Chuoi sql thao tac csdl
                string strSQL = "Update HoaDon Set TongGiaTien = @TongGiaTien, Xoa = @Xoa , GhiChu = @GhiChu, NgayLap = @NgayLap where ID = @ID and Xoa = 0";

                // Thuc thi chuoi sql
                SqlCommand cmd = new SqlCommand(strSQL, cn);


                cmd.Parameters.Add("@TongGiaTien", SqlDbType.Decimal);
                cmd.Parameters.Add("@Xoa", SqlDbType.Bit);
                cmd.Parameters.Add("@GhiChu", SqlDbType.NText);
                cmd.Parameters.Add("@NgayLap", SqlDbType.DateTime);
                cmd.Parameters.Add("@ID", SqlDbType.Int);

                cmd.Parameters["@TongGiaTien"].Value = Convert.ToDecimal(hdDto.TongGiaTien);
                cmd.Parameters["@Xoa"].Value         = hdDto.Xoa;
                cmd.Parameters["@GhiChu"].Value      = hdDto.GhiChu;
                cmd.Parameters["@NgayLap"].Value     = hdDto.NgayLap;
                cmd.Parameters["@ID"].Value          = hdDto.ID;

                cmd.ExecuteNonQuery();

                // dong ket noi csdl
                cn.Close();
                isSuccess = true;

            }
            catch (Exception ex)
            {
                InSert_LoiHeThong("Update", ex);
            }
            return isSuccess;
        }
        #endregion

        #region "[Delete]"
        /// <summary>
        /// xóa 1 đối tượng HoaDon
        /// </summary>
        /// <param name="ID">mã đối tượng HoaDon cần xóa</param>
        /// <returns></returns>
        public static bool Delete(int ID)
        {
            bool isSuccess = false;
            SqlConnection cn;
            try
            {
                // Mo ket noi
                cn = NangLuongTieuDiemDAO.DataHelper.SqlDataHelper.ConnectionData();

                // Chuoi sql thao tac csdl
                string strSQL = " Update HoaDon Set Xoa = 1 where ID = @ID";


                // Thuc thi chuoi sql
                SqlCommand cmd = new SqlCommand(strSQL, cn);

                cmd.Parameters.Add("@ID", SqlDbType.Int);
                cmd.Parameters["@ID"].Value = ID;


                cmd.ExecuteNonQuery();
                // dong ket noi csdl
                cn.Close();
                isSuccess = true;

            }
            catch (Exception ex)
            {
                InSert_LoiHeThong("Delete", ex);
            }
            return isSuccess;
        }
        #endregion

        #region "[Get all]"
        /// <summary>
        /// lấy danh sách các đối tượng HoaDon
        /// </summary>
        /// <returns></returns>
        public static List<HoaDonDTO> GetAll()
        {
            List<HoaDonDTO> ds_hdDto = new List<HoaDonDTO>();
            try
            {
                SqlConnection cn;

                // Mo ket noi
                cn = NangLuongTieuDiemDAO.DataHelper.SqlDataHelper.ConnectionData();

                // Chuoi sql thao tac csdl
                string strSQL = " Select * From HoaDon where Xoa = 0";


                // Thuc thi chuoi sql
                SqlCommand cmd = new SqlCommand(strSQL, cn);

                SqlDataReader dr = cmd.ExecuteReader();



                while (dr.Read() == true)
                {
                    HoaDonDTO hdDto = new HoaDonDTO();
                    hdDto.ID = dr.GetInt32(0);
                    hdDto.TongGiaTien = Convert.ToDouble(dr.GetDecimal(1));
                    hdDto.Xoa = dr.GetBoolean(2);
                    hdDto.GhiChu = dr.GetString(3);
                    hdDto.NgayLap = dr.GetDateTime(4);

                    ds_hdDto.Add(hdDto);
                }

                cn.Close();
            }
            catch (Exception ex)
            {
                InSert_LoiHeThong("GetAll", ex);
            }
            return ds_hdDto;
        }
        #endregion

        #region "[SelectByPrimaryKey]"
        /// <summary>
        /// Lấy 1 đối tượng HoaDon
        /// </summary>
        /// <param name="ID">mã đối tượng HoaDon cần lấy</param>
        /// <returns></returns>
        public static HoaDonDTO SelectByPrimaryKey(int ID)
        {
            HoaDonDTO hdDto = null;
            try
            {
                SqlConnection cn;

                // Mo ket noi
                cn = NangLuongTieuDiemDAO.DataHelper.SqlDataHelper.ConnectionData();

                // Chuoi sql thao tac csdl
                string strSQL = " Select * From HoaDon where ID = @ID and Xoa = 0";


                // Thuc thi chuoi sql
                SqlCommand cmd = new SqlCommand(strSQL, cn);

                cmd.Parameters.Add("@ID", SqlDbType.Int);
                cmd.Parameters["@ID"].Value = ID;

                SqlDataReader dr = cmd.ExecuteReader();

                hdDto = new HoaDonDTO();


                while (dr.Read() == true)
                {
                    hdDto.ID = dr.GetInt32(0);
                    hdDto.TongGiaTien = Convert.ToDouble(dr.GetDecimal(1));
                    hdDto.Xoa = dr.GetBoolean(2);
                    hdDto.GhiChu = dr.GetString(3);
                    hdDto.NgayLap = dr.GetDateTime(4);

                }

                // Dong ket noi csdl
                cn.Close();
            }
            catch (Exception ex)
            {
                InSert_LoiHeThong("SelectByPrimaryKey", ex);
            }
            return hdDto;
        }
        #endregion

        #region "[Hàm insert lỗi hệ thống]"
        public static void InSert_LoiHeThong(string TenHam, Exception ex)
        {
            LoiHeThongDTO lhtDto = new LoiHeThongDTO();
            lhtDto.TenLoi = ex.Message.ToString();
            lhtDto.NgayTao = DateTime.Now;
            lhtDto.TenHamBiLoi = "HoaDonDAO_" + TenHam;
            lhtDto.SuaLoi = false;
            lhtDto.GhiChu = "";
            LoiHeThongDAO.Insert(lhtDto);

        }
        #endregion
    }
}
